Ecole
Option InfoIA
PAPY: Programmation avancée python
TP3.2
Année 2022-2023
Auteur: Lucas Lestandi
lucas.lestandi@ec-nantes.fr
V1.0
Dans ce TP, vous mettrez en oeuvre les connaissances acquises au cours de précédentes séances. Vous utiliserez à bon escient les paradigmes de programmation d'un vrai projet : des fonctions, des classes, et une structure de code utilisant des modules externes.
Récemment, l'actualité a été marquée par de nombreux articles relatant le mécontentement certains milliardaires face aux comptes twitter (et autre) relatant leurs déplacements en jet privé. On notera le cas I fly Bernard, l'avion de Bernard coté français et ElonJet outre atlantique avec par Jack Sweeney. Les codes respectifs sont plus ou moins disponibles en ligne et plus ou moins faciles à suivre. Dans tous les cas, ils s'appuient sur des données publiques puisque tous les avions doivent être équipés d'un émetteur ADSB donnant leur position. Ces données sont extraites des bases et traitées avec le langage le plus simple pour ces taches : python, évidemment.
Le but de ce TP est de reproduire, dans un notebook, la capture des données ADSB, puis leur traitement pour afficher un trajet (avec matplotlib) et effectuer quelques traitements, par exemple pour une flotte complète. On proposera notre propre structure (de classe) simplifiée mais modulaire. On commencera par une rapide analyse du code source de deux comptes automatisés cité au-dessus afin de déterminer comment en tirer profit pour accélérer notre développement.
Les codes "L'avion de Bernard" et "ElonJet" sont très différent. Pour les deux codes, on proposera une analyse rapide en répondant aux questions suivantes.
Récupération des sources avec git
Description de la structure du projet,
Peut on exécuter le script principal et/ou un exemple?
Que fait le code ?
$ pyreverse -o svg NOM-PAQUET .
pyversefait parti du paquet pylint.
Evaluation de l'utilité:
Question concluion: On comparera ces deux paquets dans un court paragraphe avant de conclure sur leur utilisation dans la partie suivante.
git clone https://github.com/laviondebernard/instagram.git
CSV, un fichier Python, un fichier Text, un fichier Markdown, deux fichiers PNG, un fichier .log vide et enfin un fichier appelé img_created_here sans type spécifié et vide.
La documentation consiste en un fichier README.md qui détaille brièvement son but, son fonctionnement et des conseils ou de l'aide sur la façon de l'utiliser de manière très vague.
Le créateur n'offre aucune assistance pour l'installation ou l'utilisation. Il n'y a qu'une seule issue fermée, qui a été répondue par un non-membre du projet, et une issue ouverte écrite le 26 juillet 2022, qui n'a pas encore été répondue. Nous supposons donc que son objectif en mettant le code en ligne est simplement de le partager.
os, sys, re, random, requests, time, datetime, locale, csv, folium, PIL, selenium, geopy, smtplib et ssl.
De plus, selon la section d'aide écrite dans le fichier README.md, les paramètres suivants doivent être modifiés pour fonctionner correctement :
OpenSkyNetwork, selon le numéro icao24 correspondant. Il crée une image par vol, en utilisant la librairie folium, et publie l'image sur Instagram. Pour cela, il faut avoir Firefox, geckodriver et ajouter au code quelques données et identifiants de notre compte Instagram. C'est important de mettre la compte Instagram en français.
Sur Instagram, le code ajoute également des hashtags aléatoires et calcule les émissions de CO2. L'utilisateur doit enregistrer manuellement les tonnes de CO2 par kilomètre de l'avion correspondant dans une variable appelée tonPerKm, à la ligne 41.
Enfin, le code envoie toutes les informations par courrier électronique. L'utilisateur doit enregistrer manuellement les variables dans le fichier bernard.py, dans les variables smtp, port, email et password.
folium. Cette librairie permet de manipuler des données en Python, puis de les visualiser dans une carte Leaflet.
Comme le projet publie des images sur Instagram, la bibliothèque selenium est un autre élément important. Ce paquet est utilisé pour automatiser l'interaction avec le navigateur web à partir de Python.
$ pyreverse -o svg NOM-PAQUET .
pyversefait parti du paquet pylint.
Folium et Selenium ont tous deux des structures très complexes, donc dans les fichiers folium_classes.svg, folium_packages.svg, selenium__packages.svg et selenium_classes.svg, nous pouvons voir leurs diagrammes de classe respectifs.
Le projet utilise les classes folium.Map, folium.Marker, folium.divIcon, folium.CircleMarker et folium.PolyLine. Le projet utilise les classes folium.Map, folium.Marker, folium.divIcon, folium.CircleMarker et folium.PolyLine. En regardant les diagrammes de classes, il est possible de voir que folium.Map est l'une des classes ayant le plus d'attributs et que de nombreuses autres classes de la bibliothèque dépendent d'elle.
D'autre part, la classe la plus utilisée de la bibliothèque selenium dans le projet est webdriver. En regardant les diagrammes de classes, on constate que c'est la classe qui a le plus grand nombre d'attributs et de méthodes, ce qui est cohérent avec le fait qu'elle est la plus mentionnée dans le code.
dotenv ou simplement ajouter les identifiants dans un autre fichier python.
En ce qui concerne les normes PEP8, les éléments suivants ne sont pas respectés :
bernard.py) qui contient toute la logique du projet. Le code ne comporte pas non plus de fonctions ou de classes.
git clone https://github.com/Jxck-S/plane-notify
.py, mais il y a quelques autres utilies pour la implementation du projet : un Readme.md avec instrutions d'utilisation et un fichier texte avec tous les dependances de modules. Le projet est bien modularisé en fichiers différents, avec noms très descritifs, specialement pour les fichiers .py.
Readme.md bien complet. En plus, il y a un lien vers une page de bibliographie, avec plusieurs documentations de les modules, l'API et outils utilisés.
En plus, l'auteur se dit ouvert à nouveux contributeurs et sugestions, en donnant un lien Discord pour discuter améliorations. Comme conséquence, il y a déjà eu 383 forks, 30 pull resquests qu'on été fermées ( et 18 encore ouvertes ) et 19 utilisateurs du GitHub sont considerés comme contribuers. Effectivemente, c'est un projet open source.
os, sys, signal, pytz, tracceback, time, datetime, platform, colorama, logging... et tous est listé en Pipfile.
De plus, selon la section d'aide écrite dans le fichier README.md, il y a quelques actions à prendre avant :
mainconf.ini et plane1.ini. Ces fichiers ont le configurations d'où les informations vont être prises ( OpenSky ou ADS-B ), où les notifications vont être lancés ( Twitter ou Discord ), quel avion on souhait suivre etc. Pour chaque .ini il y a des fichiers examples si vous ne voulez pas faire le propre.OpenSkyNetwork ou d'après la plataforme ADS-B, selon le numéro icao24 correspondant. Il crée une image par vol, en utilisant la librairie folium, et envoye l'image au Twitter ou en Discord, d'après les configurations données en les fichiers .init mentionnés avant.
folium. Cette librairie permet de manipuler des données en Python, puis de les visualiser dans une carte Leaflet.
$ pyreverse -o svg NOM-PAQUET .
pyversefait parti du paquet pylint.
On a fait pour la classe avion, le résultat (fichiers .svg sont annexés)
dotenv ou simplement ajouter les identifiants dans un autre fichier python.
En ce qui concerne les normes PEP8, les éléments suivants ne sont pas respectés :
Donc, c'est évident que le projet n'est pas fait en prenant compte le PEP8.
Nous allons réduire la complexité au minimum afin d'obtenir des résultats exploitables en quelques heures.
Pour cela, on utilisera tout de même certains paquets généralistes que l'on maitrise déjà (en théorie) et quelques autres spécifiques au problème, en particulier sous forme d'API.
Pré-requis:
mamba install -c conda-forge cartopy
Objectifs:
Les données: Le système ADS-B est publique mais la conservation des données nécessites des moyens, ne serait-ce que pour le stockage et l'accés web. Pour cette raison les services proposent plusieurs version selon le degrès d'implication des utilisateurs (authentifié ou non, payant ou non).
opensky_api pour récupérer des données en direct et tracer une carte "radar" autour de sa positionInstallation openskyAPI
- cloner les sources
- Suivre le readme.md et installer avec pip
- Explorer un peu les données :
- Combien d'avions volent en ce moment dans le monde?
- Combien sont aux sol mais avec le transpondeur allumé?
- Quelle est la vitesse moyenne des appareils dans le "carré" (42,51,-5,8)?
- Proposer une ou deux autres métriques intéressantes.
- Recharger les données, les résultats sont-ils les mêmes?
from opensky_api import OpenSkyApi
import time
!which python3
!python3 -V
!ls
/opt/homebrew/bin/python3 Python 3.10.6 Fichiers Scalable Vector Graphics states TP3.2-eleve.ipynb states_carre carte.jpg trajectoire.jpg src
# Les informations d'identification d'OpenSky Network sont chargées à partir du fichier .env.
from dotenv import load_dotenv
import os
env_path = os.path.join('.env')
load_dotenv(env_path)
USERNAME = os.getenv('USERNAME')
PASSWORD = os.getenv('PASSWORD')
#api = OpenSkyApi()
#On a crée un compte pour avoir plusieurs plus de requêtes
api = OpenSkyApi(USERNAME, PASSWORD)
states = api.get_states()
#Confirmation de l'overture de la classe de l'API
type(states)
opensky_api.OpenSkyStates
#Réponse: la quantité d'états où l'attribut 'on_ground' est False
#(ça veut dire, l'avion du état correpondant est au air)
listt = [k for k in states.states if k.on_ground == False]
print(f"Combien d'avions volent en ce moment dans le monde? : \n {len(listt)} des avions")
Combien d'avions volent en ce moment dans le monde? : 6661 des avions
#Ici on vérifie tous les vols avec les attributs on_ground and squack == True : sont en sol et avec le transponder allumé
quantite = 0
for s in states.states:
if s.on_ground and s.squawk:
quantite += 1
print(f"Combien sont aux sol mais avec le transpondeur allumé? : \n {quantite} des avions")
Combien sont aux sol mais avec le transpondeur allumé? : 121 des avions
#On prend les données en le carré
states_carre = api.get_states(bbox=(42,51,-5,8)) # on récupére tous les vols en ce moment sur un zone couvrant l'essentiel de la France.
type(states_carre)
opensky_api.OpenSkyStates
#On passe pour chaque vol et on fait la moyenne
vitesse_somme = 0
nombre = 0
for s in states_carre.states:
if s.velocity:
vitesse_somme += s.velocity
nombre += 1
print(f"Quelle est la vitesse moyenne des appareils dans le 'carré' (42,51,-5,8)? : \n {vitesse_somme / nombre} m/s")
Quelle est la vitesse moyenne des appareils dans le 'carré' (42,51,-5,8)? : 174.53462264150934 m/s
L'attribut origin_country est important car il est possible d'obtenir des données sur le nombre d'avions au départ de chaque pays.
D'autre part, true_track est également intéressant car il indique dans quelle direction et quel sens l'avion se dirige.
# Affichage des dix premières données avec le pays d'origine le Brésil aveec le true_track
listt = [(k.origin_country, k.true_track) for k in states.states if k.origin_country == 'Brazil']
for i in range(10):
print(f"Origin country : {listt[i][0]}; true_track : {listt[i][1]}")
Origin country : Brazil; true_track : 221.6 Origin country : Brazil; true_track : 216.36 Origin country : Brazil; true_track : 215.54 Origin country : Brazil; true_track : 40.97 Origin country : Brazil; true_track : 349.91 Origin country : Brazil; true_track : 204.8 Origin country : Brazil; true_track : 327.49 Origin country : Brazil; true_track : 201.41 Origin country : Brazil; true_track : 135.36 Origin country : Brazil; true_track : 73.13
states2 = api.get_states()
# Les calculs sont identiques
listt = [k for k in states2.states if k.on_ground == False]
print(f"Combien d'avions volent en ce moment dans le monde? : \n {len(listt)} des avions")
quantite = 0
for s in states2.states:
if s.on_ground and s.squawk:
quantite += 1
print(f"Q2 : Combien sont aux sol mais avec le transpondeur allumé? : \n {quantite} des avions")
Combien d'avions volent en ce moment dans le monde? : 6664 des avions Q2 : Combien sont aux sol mais avec le transpondeur allumé? : 122 des avions
states_carre2 = api.get_states(bbox=(42,51,-5,8))
vitesse_som = 0
nombre = 0
for s in states_carre2.states:
if s.velocity:
vitesse_som += s.velocity
nombre += 1
print(f"Quelle est la vitesse moyenne des appareils dans le 'carré' (42,51,-5,8)? : \n {vitesse_som / nombre} m/s")
Quelle est la vitesse moyenne des appareils dans le 'carré' (42,51,-5,8)? : 175.29663551401865 m/s
**Après avoir rechargé les données, nous pouvons voir que les données ont changé. C'est évident puisque nous utilisons des données en temps réel.
Attention le nombre de requettes étant limité, on ne rejouera pas la cellule précédente. On pourra récuppérer les états correspondants aux avions avec states.states qui est une liste de vecteurs d'états. On retrouve la description dans la documentation.
Represents the state of a vehicle at a particular time. It has the following fields:
- icao24 - ICAO24 address of the transmitter in hex string representation.
- callsign - callsign of the vehicle. Can be None if no callsign has been received.
- origin_country - inferred through the ICAO24 address
- time_position - seconds since epoch of last position report. Can be None if there was no position report received by OpenSky within 15s before.
- last_contact - seconds since epoch of last received message from this transponder
- longitude - in ellipsoidal coordinates (WGS-84) and degrees. Can be None
- latitude - in ellipsoidal coordinates (WGS-84) and degrees. Can be None
- geo_altitude - geometric altitude in meters. Can be None
- on_ground - true if aircraft is on ground (sends ADS-B surface position reports).
- velocity - over ground in m/s. Can be None if information not present
- true_track - in decimal degrees (0 is north). Can be None if information not present.
- vertical_rate - in m/s, incline is positive, decline negative. Can be None if information not present.
- sensors - serial numbers of sensors which received messages from the vehicle within the validity period of this state vector. Can be None if no filtering for sensor has been requested.
- baro_altitude - barometric altitude in meters. Can be None
- squawk - transponder code aka Squawk. Can be None
- spi - special purpose indicator
- position_source - origin of this state's position: 0 = ADS-B, 1 = ASTERIX, 2 = MLAT, 3 = FLARM
On va se satisfaire d'extraire les positions, vitesses et orientation pour les positionner sur la carte ainsi que icao24 et calssign pour pouvoir identifier les appareils et les croiser avec d'autres bases de données.
@classmethod. Ne pas oublier la documentation de votre code, il sera relu!
class Avion:
""" Il représente les avions en stockant des informations sur leur position, leur vitesse, leur orientation et leur identification. """
def __init__(self, time, icao24, callsign, longitude, latitude, geo_altitude, velocity, true_track, vertical_rate, on_ground):
self.time = time
self.icao24 = icao24
self.callsign = callsign
self.longitude = longitude
self.latitude = latitude
self.geo_altitude = geo_altitude
self.velocity = velocity
self.true_track = true_track
self.vertical_rate = vertical_rate
self.on_ground = on_ground
#Classmethod pour creer l'objet avec le objet states directement
@classmethod
def fromStates(cls, states):
return cls(time = states.time_position, icao24 = states.icao24, callsign = states.callsign, longitude = states.longitude, latitude = states.latitude, geo_altitude = states.geo_altitude,
velocity = states.velocity, true_track = states.true_track, vertical_rate = states.vertical_rate, on_ground = states.on_ground)
#Classmethod pour creer l'objet avec la liste qu'on peut avoir en utilisant les données fournis en le .csv en
#le dérnier exercice
@classmethod
def fromList(cls, list1):
return cls(time = list1[0], icao24 = list1[1], callsign = list1[7], longitude = list1[3], latitude = list1[2], geo_altitude = list1[9],
velocity = list1[4], true_track = list1[5], vertical_rate = list1[6], on_ground = list1[8])
plane1 = Avion.fromStates(states.states[0])
On écrira une fonction d'affichage qui place les avions sur la carte et représente leur vitesse (taille) et leur direction de manière similaire à ce qui est proposé dans l'exemple.
import matplotlib.pyplot as plt
from matplotlib.markers import MarkerStyle
from matplotlib.colors import Normalize
from matplotlib.textpath import TextPath
from matplotlib.transforms import Affine2D
from avion import Avion
import cartopy.crs as ccrs
import cartopy.io.img_tiles as cimgt
def plot(liste_avion, *args, **kwargs):
fig = plt.figure(figsize=(15,15))
tile=cimgt.GoogleTiles("RGB")
# Create a GeoAxes in the tile's projection.
ax = fig.add_subplot(1, 1, 1, projection=tile.crs)
# Limit the extent of the map to a small longitude/latitude range.
ax.set_extent([-5, 8, 42, 51], crs=ccrs.Geodetic())
# Add the Stamen data at zoom level 8.
ax.add_image(tile, 8)
SUCCESS_SYMBOLS = TextPath((0, 0), "✈") # Définie le marquer avion
#boucle de plot a écrire
fig.savefig("carte.jpg")
plt.show()
On obtiendra un résultat similaire à celui ci! Ne pas hésiter à utiliser d'autres fonds de cartes, icones ou types de représentation (vecteurs...)

# Création d'une liste avec des instances de la classe avion.
ciel = list()
for s in states_carre.states:
#ciel.append(Avion(s.time_position, s.icao24, s.callsign, s.longitude, s.latitude, s.geo_altitude, s.velocity, s.true_track, s.vertical_rate, s.on_ground))
ciel.append(Avion.fromStates(s))
# Importation des librairies à utiliser pour afficher les avions sur la carte.
import matplotlib.pyplot as plt
from matplotlib.markers import MarkerStyle
from matplotlib.colors import Normalize
from matplotlib.textpath import TextPath
from matplotlib.transforms import Affine2D
import cartopy.crs as ccrs
import cartopy.io.img_tiles as cimgt
# Création d'une nouvelle figure de 15 pouces de large et de haut.
# Le dpi (dots-per-inch) c'est la résolution de la figure
fig = plt.figure(figsize=(15,15),dpi=200)
# Implémentation de la recherche de tuiles web en utilisant le système de coordonnées Google WTS.
tile = cimgt.GoogleTiles("RGB")
# Create a GeoAxes in the tile's projection.
ax = fig.add_subplot(1, 1, 1, projection=tile.crs)
# Limitation de l'étendue de la carte à une petite plage de longitude/latitude.
ax.set_extent([-5, 8, 42, 51], crs=ccrs.Geodetic())
# Addition de la tuile aux axes au niveau de zoom 8
ax.add_image(tile, 8)
# Création d'un chemin à partir du texte avec TextPath.
# Le symbole unicode U+2708 est utilisé.
SUCCESS_SYMBOLS = TextPath((0, 0), "✈")
# Tous les avions sont ajoutés/dessinés sur la carte.
for af in ciel:
# Création d'un MarkerStyle pour pouvoir le faire tourner arbitrairement.
m = MarkerStyle(SUCCESS_SYMBOLS)
# Rotation du marker
# Ajoutez 90 degrés pour que le symbole X soit orienté vers le nord lorsqu'il est à 0 degré.
# L'attribut "true_track" est soustrait afin que l'angle soit positif du côté droit,
# comme expliqué sur ce site web : https://www.skybrary.aero/articles/heading-track-and-radial
m._transform = m.get_transform().rotate_deg(90 - af.true_track)
# Définition de la couleur du marker
if af.velocity > 10:
color='b'
else:
color="k"
# L'avion est ajouté à la carte en fonction de ses valeurs de latitude et de longitude.
# La taille de la figure dépend directement de la vitesse actuelle de l'avion.
ax.plot(af.longitude, af.latitude,
marker=m,
color=color, markersize=50*af.velocity/300, transform=ccrs.Geodetic())
# La figure est affichée
plt.show()
%load_ext autoreload
%autoreload 2
Charger les données fournies avec pandas: https://box.ec-nantes.fr/index.php/s/pR5bfaFdncMZdcy. Il s'agit d'une version allégée, du dump hebdomadaire (450Mo) des données de opensky-network.
Réduire les données pour pouvoir tracer Une fois que l'on a bien les données en main on s'intéresse au déplacement d'un seul appareil (comme pour nos deux influenceurs).

import pandas as pd
import numpy as np
import os
import datetime
import math
os.chdir('/Users/dgalembeck/Documents/Coding/PAPY/#3.2')
df = pd.read_csv('/Users/dgalembeck/Documents/Coding/PAPY/#3.2/flights_1day.csv')
df = df.dropna()
df.sort_values(by = ['time'])
df.head()
| Unnamed: 0 | time | icao24 | lat | lon | velocity | heading | vertrate | callsign | onground | geoaltitude | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 1656295200 | a7e152 | 40.915553 | -87.592496 | 245.074124 | 139.085617 | 0.32512 | DAL2356 | False | 10561.32 |
| 1 | 1 | 1656295200 | a8f975 | 40.943810 | -88.107543 | 196.871475 | 187.960714 | -5.52704 | ENY3658 | False | 4320.54 |
| 2 | 2 | 1656295200 | 7c6d39 | -34.748592 | 139.072666 | 215.881446 | 51.190929 | 11.05408 | VOZ1447 | False | 6949.44 |
| 3 | 3 | 1656295200 | ad6ff2 | 41.889038 | -87.875332 | 131.028796 | 136.909152 | 15.93088 | AAL1173 | False | 1196.34 |
| 4 | 4 | 1656295200 | a537ed | 42.287587 | -86.857271 | 228.232894 | 86.898971 | 6.17728 | RPA4798 | False | 6697.98 |
# Comme le time est donné en un entier répresentant le secondes après Linux Epoch time (00:00:00, 1 janvier 1970),
# il suffit de convertir le plus grand et plus petit entir pour obtenir la plus grande et plus petite date
print('The first flight was on:', datetime.datetime.fromtimestamp(min(df.time)))
print('The last flight was on:', datetime.datetime.fromtimestamp(max(df.time)))
print(len(df.onground))
The first flight was on: 2022-06-27 04:00:00 The last flight was on: 2022-06-27 04:59:50 1659742
print('Vitesse moyenne de tous les avions pendant tout le période :', np.mean(df.velocity))
print('Position moyenne (latitude moyenne, longitude moyenne) de tous les avions pendant tout le période :', (np.mean(df.lat), np.mean(df.lon)))
# L'idee c'est toujours pareil : d'avoir une sousdf avec les conditions qu'on veut
# Pour ça, on passe une masque comme 'argument' pour le df, la masque a un Boolean pour chaque ligne:
# Si la ligne en question correspont à les conditions desirees (on_ground == False et time approprié)
# Chaque 10 seconds, combien de avions uniques vollaient
seconds = list(set(df.time)) # La liste est déjà de 10 en 10 secondes
seconds.sort()
for k in seconds:
val = len(set(df[(df.time == k) & (df.onground == False)].icao24)) # on passe la masque, avec set() pour prendre les avions qu'un fois
print('At {}, there were {} differents planes flying'.format(datetime.datetime.fromtimestamp(k), val))
# Dans l'espace d'un minute, combien de avions uniques vollaient
interval = 60
minutes = list(set([k if (k - list(seconds)[0])%interval == 0 else 1 for k in seconds]))
minutes.sort()
minutes.remove(1)
for k in range(len(minutes) - 1):
val = len(set(df[(df.time > minutes[k]) & (df.time < minutes[k+1]) & (df.onground == False)].icao24))
print('Between {} and {}, {} different planes flew'.format(datetime.datetime.fromtimestamp(minutes[k]), datetime.datetime.fromtimestamp(minutes[k+1]),val))
# Dans l'espace d'un heure, combien de avions uniques vollaient
interval = 600
tenminutes = list(set([k if (k - list(seconds)[0])%interval == 0 else 1 for k in seconds]))
tenminutes.sort()
tenminutes.remove(1)
for k in range(len(tenminutes) - 1):
val = len(set(df[(df.time > tenminutes[k]) & (df.time < tenminutes[k+1]) & (df.onground == False)].icao24))
print('Between {} and {}, {} different planes flew'.format(datetime.datetime.fromtimestamp(tenminutes[k]), datetime.datetime.fromtimestamp(tenminutes[k+1]),val))
Vitesse moyenne de tous les avions pendant tout le période : 186.07288491185633 Position moyenne (latitude moyenne, longitude moyenne) de tous les avions pendant tout le période : (32.360635418136546, -35.446402330308636) At 2022-06-27 04:00:00, there were 6 differents planes flying At 2022-06-27 04:00:10, there were 3870 differents planes flying At 2022-06-27 04:00:20, there were 3928 differents planes flying At 2022-06-27 04:00:30, there were 3988 differents planes flying At 2022-06-27 04:00:40, there were 4034 differents planes flying At 2022-06-27 04:00:50, there were 4073 differents planes flying At 2022-06-27 04:01:00, there were 4113 differents planes flying At 2022-06-27 04:01:10, there were 4147 differents planes flying At 2022-06-27 04:01:20, there were 4172 differents planes flying At 2022-06-27 04:01:30, there were 4201 differents planes flying At 2022-06-27 04:01:40, there were 4225 differents planes flying At 2022-06-27 04:01:50, there were 4254 differents planes flying At 2022-06-27 04:02:00, there were 4282 differents planes flying At 2022-06-27 04:02:10, there were 4304 differents planes flying At 2022-06-27 04:02:20, there were 4324 differents planes flying At 2022-06-27 04:02:30, there were 4346 differents planes flying At 2022-06-27 04:02:40, there were 4378 differents planes flying At 2022-06-27 04:02:50, there were 4402 differents planes flying At 2022-06-27 04:03:00, there were 4422 differents planes flying At 2022-06-27 04:03:10, there were 4444 differents planes flying At 2022-06-27 04:03:20, there were 4465 differents planes flying At 2022-06-27 04:03:30, there were 4491 differents planes flying At 2022-06-27 04:03:40, there were 4506 differents planes flying At 2022-06-27 04:03:50, there were 4519 differents planes flying At 2022-06-27 04:04:00, there were 4533 differents planes flying At 2022-06-27 04:04:10, there were 4557 differents planes flying At 2022-06-27 04:04:20, there were 4570 differents planes flying At 2022-06-27 04:04:30, there were 4594 differents planes flying At 2022-06-27 04:04:40, there were 4612 differents planes flying At 2022-06-27 04:04:50, there were 4629 differents planes flying At 2022-06-27 04:05:00, there were 4639 differents planes flying At 2022-06-27 04:05:10, there were 4653 differents planes flying At 2022-06-27 04:05:20, there were 4657 differents planes flying At 2022-06-27 04:05:30, there were 4663 differents planes flying At 2022-06-27 04:05:40, there were 4671 differents planes flying At 2022-06-27 04:05:50, there were 4686 differents planes flying At 2022-06-27 04:06:00, there were 4694 differents planes flying At 2022-06-27 04:06:10, there were 4705 differents planes flying At 2022-06-27 04:06:20, there were 4709 differents planes flying At 2022-06-27 04:06:30, there were 4712 differents planes flying At 2022-06-27 04:06:40, there were 4717 differents planes flying At 2022-06-27 04:06:50, there were 4722 differents planes flying At 2022-06-27 04:07:00, there were 4725 differents planes flying At 2022-06-27 04:07:10, there were 4716 differents planes flying At 2022-06-27 04:07:20, there were 4724 differents planes flying At 2022-06-27 04:07:30, there were 4730 differents planes flying At 2022-06-27 04:07:40, there were 4729 differents planes flying At 2022-06-27 04:07:50, there were 4737 differents planes flying At 2022-06-27 04:08:00, there were 4743 differents planes flying At 2022-06-27 04:08:10, there were 4734 differents planes flying At 2022-06-27 04:08:20, there were 4736 differents planes flying At 2022-06-27 04:08:30, there were 4736 differents planes flying At 2022-06-27 04:08:40, there were 4741 differents planes flying At 2022-06-27 04:08:50, there were 4749 differents planes flying At 2022-06-27 04:09:00, there were 4750 differents planes flying At 2022-06-27 04:09:10, there were 4758 differents planes flying At 2022-06-27 04:09:20, there were 4764 differents planes flying At 2022-06-27 04:09:30, there were 4752 differents planes flying At 2022-06-27 04:09:40, there were 4752 differents planes flying At 2022-06-27 04:09:50, there were 4758 differents planes flying At 2022-06-27 04:10:00, there were 4754 differents planes flying At 2022-06-27 04:10:10, there were 4757 differents planes flying At 2022-06-27 04:10:20, there were 4761 differents planes flying At 2022-06-27 04:10:30, there were 4758 differents planes flying At 2022-06-27 04:10:40, there were 4761 differents planes flying At 2022-06-27 04:10:50, there were 4754 differents planes flying At 2022-06-27 04:11:00, there were 4759 differents planes flying At 2022-06-27 04:11:10, there were 4753 differents planes flying At 2022-06-27 04:11:20, there were 4757 differents planes flying At 2022-06-27 04:11:30, there were 4742 differents planes flying At 2022-06-27 04:11:40, there were 4735 differents planes flying At 2022-06-27 04:11:50, there were 4734 differents planes flying At 2022-06-27 04:12:00, there were 4732 differents planes flying At 2022-06-27 04:12:10, there were 4729 differents planes flying At 2022-06-27 04:12:20, there were 4735 differents planes flying At 2022-06-27 04:12:30, there were 4725 differents planes flying At 2022-06-27 04:12:40, there were 4728 differents planes flying At 2022-06-27 04:12:50, there were 4722 differents planes flying At 2022-06-27 04:13:00, there were 4719 differents planes flying At 2022-06-27 04:13:10, there were 4727 differents planes flying At 2022-06-27 04:13:20, there were 4722 differents planes flying At 2022-06-27 04:13:30, there were 4707 differents planes flying At 2022-06-27 04:13:40, there were 4697 differents planes flying At 2022-06-27 04:13:50, there were 4703 differents planes flying At 2022-06-27 04:14:00, there were 4704 differents planes flying At 2022-06-27 04:14:10, there were 4710 differents planes flying At 2022-06-27 04:14:20, there were 4712 differents planes flying At 2022-06-27 04:14:30, there were 4727 differents planes flying At 2022-06-27 04:14:40, there were 4722 differents planes flying At 2022-06-27 04:14:50, there were 4730 differents planes flying At 2022-06-27 04:15:00, there were 4742 differents planes flying At 2022-06-27 04:15:10, there were 4743 differents planes flying At 2022-06-27 04:15:20, there were 4740 differents planes flying At 2022-06-27 04:15:30, there were 4744 differents planes flying At 2022-06-27 04:15:40, there were 4756 differents planes flying At 2022-06-27 04:15:50, there were 4760 differents planes flying At 2022-06-27 04:16:00, there were 4751 differents planes flying At 2022-06-27 04:16:10, there were 4740 differents planes flying At 2022-06-27 04:16:20, there were 4732 differents planes flying At 2022-06-27 04:16:30, there were 4737 differents planes flying At 2022-06-27 04:16:40, there were 4731 differents planes flying At 2022-06-27 04:16:50, there were 4735 differents planes flying At 2022-06-27 04:17:00, there were 4739 differents planes flying At 2022-06-27 04:17:10, there were 4728 differents planes flying At 2022-06-27 04:17:20, there were 4726 differents planes flying At 2022-06-27 04:17:30, there were 4726 differents planes flying At 2022-06-27 04:17:40, there were 4723 differents planes flying At 2022-06-27 04:17:50, there were 4724 differents planes flying At 2022-06-27 04:18:00, there were 4725 differents planes flying At 2022-06-27 04:18:10, there were 4712 differents planes flying At 2022-06-27 04:18:20, there were 4717 differents planes flying At 2022-06-27 04:18:30, there were 4716 differents planes flying At 2022-06-27 04:18:40, there were 4714 differents planes flying At 2022-06-27 04:18:50, there were 4714 differents planes flying At 2022-06-27 04:19:00, there were 4722 differents planes flying At 2022-06-27 04:19:10, there were 4725 differents planes flying At 2022-06-27 04:19:20, there were 4725 differents planes flying At 2022-06-27 04:19:30, there were 4713 differents planes flying At 2022-06-27 04:19:40, there were 4713 differents planes flying At 2022-06-27 04:19:50, there were 4712 differents planes flying At 2022-06-27 04:20:00, there were 4711 differents planes flying At 2022-06-27 04:20:10, there were 4703 differents planes flying At 2022-06-27 04:20:20, there were 4696 differents planes flying At 2022-06-27 04:20:30, there were 4690 differents planes flying At 2022-06-27 04:20:40, there were 4699 differents planes flying At 2022-06-27 04:20:50, there were 4712 differents planes flying At 2022-06-27 04:21:00, there were 4711 differents planes flying At 2022-06-27 04:21:10, there were 4708 differents planes flying At 2022-06-27 04:21:20, there were 4704 differents planes flying At 2022-06-27 04:21:30, there were 4710 differents planes flying At 2022-06-27 04:21:40, there were 4709 differents planes flying At 2022-06-27 04:21:50, there were 4710 differents planes flying At 2022-06-27 04:22:00, there were 4700 differents planes flying At 2022-06-27 04:22:10, there were 4704 differents planes flying At 2022-06-27 04:22:20, there were 4705 differents planes flying At 2022-06-27 04:22:30, there were 4702 differents planes flying At 2022-06-27 04:22:40, there were 4705 differents planes flying At 2022-06-27 04:22:50, there were 4713 differents planes flying At 2022-06-27 04:23:00, there were 4706 differents planes flying At 2022-06-27 04:23:10, there were 4711 differents planes flying At 2022-06-27 04:23:20, there were 4710 differents planes flying At 2022-06-27 04:23:30, there were 4712 differents planes flying At 2022-06-27 04:23:40, there were 4713 differents planes flying At 2022-06-27 04:23:50, there were 4711 differents planes flying At 2022-06-27 04:24:00, there were 4712 differents planes flying At 2022-06-27 04:24:10, there were 4709 differents planes flying At 2022-06-27 04:24:20, there were 4707 differents planes flying At 2022-06-27 04:24:30, there were 4707 differents planes flying At 2022-06-27 04:24:40, there were 4706 differents planes flying At 2022-06-27 04:24:50, there were 4713 differents planes flying At 2022-06-27 04:25:00, there were 4723 differents planes flying At 2022-06-27 04:25:10, there were 4720 differents planes flying At 2022-06-27 04:25:20, there were 4718 differents planes flying At 2022-06-27 04:25:30, there were 4721 differents planes flying At 2022-06-27 04:25:40, there were 4711 differents planes flying At 2022-06-27 04:25:50, there were 4709 differents planes flying At 2022-06-27 04:26:00, there were 4707 differents planes flying At 2022-06-27 04:26:10, there were 4703 differents planes flying At 2022-06-27 04:26:20, there were 4706 differents planes flying At 2022-06-27 04:26:30, there were 4690 differents planes flying At 2022-06-27 04:26:40, there were 4674 differents planes flying At 2022-06-27 04:26:50, there were 4672 differents planes flying At 2022-06-27 04:27:00, there were 4665 differents planes flying At 2022-06-27 04:27:10, there were 4665 differents planes flying At 2022-06-27 04:27:20, there were 4664 differents planes flying At 2022-06-27 04:27:30, there were 4661 differents planes flying At 2022-06-27 04:27:40, there were 4672 differents planes flying At 2022-06-27 04:27:50, there were 4671 differents planes flying At 2022-06-27 04:28:00, there were 4670 differents planes flying At 2022-06-27 04:28:10, there were 4670 differents planes flying At 2022-06-27 04:28:20, there were 4661 differents planes flying At 2022-06-27 04:28:30, there were 4649 differents planes flying At 2022-06-27 04:28:40, there were 4655 differents planes flying At 2022-06-27 04:28:50, there were 4651 differents planes flying At 2022-06-27 04:29:00, there were 4655 differents planes flying At 2022-06-27 04:29:10, there were 4647 differents planes flying At 2022-06-27 04:29:20, there were 4637 differents planes flying At 2022-06-27 04:29:30, there were 4637 differents planes flying At 2022-06-27 04:29:40, there were 4643 differents planes flying At 2022-06-27 04:29:50, there were 4637 differents planes flying At 2022-06-27 04:30:00, there were 4638 differents planes flying At 2022-06-27 04:30:10, there were 4640 differents planes flying At 2022-06-27 04:30:20, there were 4642 differents planes flying At 2022-06-27 04:30:30, there were 4641 differents planes flying At 2022-06-27 04:30:40, there were 4633 differents planes flying At 2022-06-27 04:30:50, there were 4631 differents planes flying At 2022-06-27 04:31:00, there were 4632 differents planes flying At 2022-06-27 04:31:10, there were 4628 differents planes flying At 2022-06-27 04:31:20, there were 4634 differents planes flying At 2022-06-27 04:31:30, there were 4637 differents planes flying At 2022-06-27 04:31:40, there were 4640 differents planes flying At 2022-06-27 04:31:50, there were 4633 differents planes flying At 2022-06-27 04:32:00, there were 4635 differents planes flying At 2022-06-27 04:32:10, there were 4624 differents planes flying At 2022-06-27 04:32:20, there were 4619 differents planes flying At 2022-06-27 04:32:30, there were 4624 differents planes flying At 2022-06-27 04:32:40, there were 4622 differents planes flying At 2022-06-27 04:32:50, there were 4626 differents planes flying At 2022-06-27 04:33:00, there were 4621 differents planes flying At 2022-06-27 04:33:10, there were 4628 differents planes flying At 2022-06-27 04:33:20, there were 4627 differents planes flying At 2022-06-27 04:33:30, there were 4631 differents planes flying At 2022-06-27 04:33:40, there were 4634 differents planes flying At 2022-06-27 04:33:50, there were 4629 differents planes flying At 2022-06-27 04:34:00, there were 4631 differents planes flying At 2022-06-27 04:34:10, there were 4634 differents planes flying At 2022-06-27 04:34:20, there were 4642 differents planes flying At 2022-06-27 04:34:30, there were 4636 differents planes flying At 2022-06-27 04:34:40, there were 4633 differents planes flying At 2022-06-27 04:34:50, there were 4632 differents planes flying At 2022-06-27 04:35:00, there were 4629 differents planes flying At 2022-06-27 04:35:10, there were 4622 differents planes flying At 2022-06-27 04:35:20, there were 4622 differents planes flying At 2022-06-27 04:35:30, there were 4620 differents planes flying At 2022-06-27 04:35:40, there were 4618 differents planes flying At 2022-06-27 04:35:50, there were 4614 differents planes flying At 2022-06-27 04:36:00, there were 4610 differents planes flying At 2022-06-27 04:36:10, there were 4611 differents planes flying At 2022-06-27 04:36:20, there were 4616 differents planes flying At 2022-06-27 04:36:30, there were 4617 differents planes flying At 2022-06-27 04:36:40, there were 4624 differents planes flying At 2022-06-27 04:36:50, there were 4636 differents planes flying At 2022-06-27 04:37:00, there were 4636 differents planes flying At 2022-06-27 04:37:10, there were 4638 differents planes flying At 2022-06-27 04:37:20, there were 4637 differents planes flying At 2022-06-27 04:37:30, there were 4642 differents planes flying At 2022-06-27 04:37:40, there were 4641 differents planes flying At 2022-06-27 04:37:50, there were 4634 differents planes flying At 2022-06-27 04:38:00, there were 4634 differents planes flying At 2022-06-27 04:38:10, there were 4634 differents planes flying At 2022-06-27 04:38:20, there were 4631 differents planes flying At 2022-06-27 04:38:30, there were 4632 differents planes flying At 2022-06-27 04:38:40, there were 4630 differents planes flying At 2022-06-27 04:38:50, there were 4632 differents planes flying At 2022-06-27 04:39:00, there were 4632 differents planes flying At 2022-06-27 04:39:10, there were 4632 differents planes flying At 2022-06-27 04:39:20, there were 4626 differents planes flying At 2022-06-27 04:39:30, there were 4626 differents planes flying At 2022-06-27 04:39:40, there were 4612 differents planes flying At 2022-06-27 04:39:50, there were 4611 differents planes flying At 2022-06-27 04:40:00, there were 4597 differents planes flying At 2022-06-27 04:40:10, there were 4606 differents planes flying At 2022-06-27 04:40:20, there were 4613 differents planes flying At 2022-06-27 04:40:30, there were 4619 differents planes flying At 2022-06-27 04:40:40, there were 4615 differents planes flying At 2022-06-27 04:40:50, there were 4621 differents planes flying At 2022-06-27 04:41:00, there were 4622 differents planes flying At 2022-06-27 04:41:10, there were 4618 differents planes flying At 2022-06-27 04:41:20, there were 4617 differents planes flying At 2022-06-27 04:41:30, there were 4614 differents planes flying At 2022-06-27 04:41:40, there were 4610 differents planes flying At 2022-06-27 04:41:50, there were 4614 differents planes flying At 2022-06-27 04:42:00, there were 4609 differents planes flying At 2022-06-27 04:42:10, there were 4621 differents planes flying At 2022-06-27 04:42:20, there were 4624 differents planes flying At 2022-06-27 04:42:30, there were 4623 differents planes flying At 2022-06-27 04:42:40, there were 4624 differents planes flying At 2022-06-27 04:42:50, there were 4631 differents planes flying At 2022-06-27 04:43:00, there were 4622 differents planes flying At 2022-06-27 04:43:10, there were 4629 differents planes flying At 2022-06-27 04:43:20, there were 4629 differents planes flying At 2022-06-27 04:43:30, there were 4630 differents planes flying At 2022-06-27 04:43:40, there were 4624 differents planes flying At 2022-06-27 04:43:50, there were 4626 differents planes flying At 2022-06-27 04:44:00, there were 4623 differents planes flying At 2022-06-27 04:44:10, there were 4622 differents planes flying At 2022-06-27 04:44:20, there were 4620 differents planes flying At 2022-06-27 04:44:30, there were 4624 differents planes flying At 2022-06-27 04:44:40, there were 4619 differents planes flying At 2022-06-27 04:44:50, there were 4615 differents planes flying At 2022-06-27 04:45:00, there were 4612 differents planes flying At 2022-06-27 04:45:10, there were 4611 differents planes flying At 2022-06-27 04:45:20, there were 4610 differents planes flying At 2022-06-27 04:45:30, there were 4608 differents planes flying At 2022-06-27 04:45:40, there were 4613 differents planes flying At 2022-06-27 04:45:50, there were 4612 differents planes flying At 2022-06-27 04:46:00, there were 4602 differents planes flying At 2022-06-27 04:46:10, there were 4607 differents planes flying At 2022-06-27 04:46:20, there were 4603 differents planes flying At 2022-06-27 04:46:30, there were 4598 differents planes flying At 2022-06-27 04:46:40, there were 4597 differents planes flying At 2022-06-27 04:46:50, there were 4604 differents planes flying At 2022-06-27 04:47:00, there were 4603 differents planes flying At 2022-06-27 04:47:10, there were 4596 differents planes flying At 2022-06-27 04:47:20, there were 4592 differents planes flying At 2022-06-27 04:47:30, there were 4586 differents planes flying At 2022-06-27 04:47:40, there were 4583 differents planes flying At 2022-06-27 04:47:50, there were 4578 differents planes flying At 2022-06-27 04:48:00, there were 4577 differents planes flying At 2022-06-27 04:48:10, there were 4574 differents planes flying At 2022-06-27 04:48:20, there were 4570 differents planes flying At 2022-06-27 04:48:30, there were 4579 differents planes flying At 2022-06-27 04:48:40, there were 4578 differents planes flying At 2022-06-27 04:48:50, there were 4564 differents planes flying At 2022-06-27 04:49:00, there were 4559 differents planes flying At 2022-06-27 04:49:10, there were 4564 differents planes flying At 2022-06-27 04:49:20, there were 4570 differents planes flying At 2022-06-27 04:49:30, there were 4568 differents planes flying At 2022-06-27 04:49:40, there were 4568 differents planes flying At 2022-06-27 04:49:50, there were 4566 differents planes flying At 2022-06-27 04:50:00, there were 4568 differents planes flying At 2022-06-27 04:50:10, there were 4572 differents planes flying At 2022-06-27 04:50:20, there were 4569 differents planes flying At 2022-06-27 04:50:30, there were 4571 differents planes flying At 2022-06-27 04:50:40, there were 4570 differents planes flying At 2022-06-27 04:50:50, there were 4577 differents planes flying At 2022-06-27 04:51:00, there were 4578 differents planes flying At 2022-06-27 04:51:10, there were 4592 differents planes flying At 2022-06-27 04:51:20, there were 4585 differents planes flying At 2022-06-27 04:51:30, there were 4593 differents planes flying At 2022-06-27 04:51:40, there were 4587 differents planes flying At 2022-06-27 04:51:50, there were 4589 differents planes flying At 2022-06-27 04:52:00, there were 4586 differents planes flying At 2022-06-27 04:52:10, there were 4580 differents planes flying At 2022-06-27 04:52:20, there were 4582 differents planes flying At 2022-06-27 04:52:30, there were 4589 differents planes flying At 2022-06-27 04:52:40, there were 4588 differents planes flying At 2022-06-27 04:52:50, there were 4580 differents planes flying At 2022-06-27 04:53:00, there were 4573 differents planes flying At 2022-06-27 04:53:10, there were 4573 differents planes flying At 2022-06-27 04:53:20, there were 4579 differents planes flying At 2022-06-27 04:53:30, there were 4572 differents planes flying At 2022-06-27 04:53:40, there were 4570 differents planes flying At 2022-06-27 04:53:50, there were 4572 differents planes flying At 2022-06-27 04:54:00, there were 4568 differents planes flying At 2022-06-27 04:54:10, there were 4567 differents planes flying At 2022-06-27 04:54:20, there were 4566 differents planes flying At 2022-06-27 04:54:30, there were 4566 differents planes flying At 2022-06-27 04:54:40, there were 4563 differents planes flying At 2022-06-27 04:54:50, there were 4565 differents planes flying At 2022-06-27 04:55:00, there were 4561 differents planes flying At 2022-06-27 04:55:10, there were 4551 differents planes flying At 2022-06-27 04:55:20, there were 4560 differents planes flying At 2022-06-27 04:55:30, there were 4561 differents planes flying At 2022-06-27 04:55:40, there were 4559 differents planes flying At 2022-06-27 04:55:50, there were 4555 differents planes flying At 2022-06-27 04:56:00, there were 4542 differents planes flying At 2022-06-27 04:56:10, there were 4552 differents planes flying At 2022-06-27 04:56:20, there were 4551 differents planes flying At 2022-06-27 04:56:30, there were 4550 differents planes flying At 2022-06-27 04:56:40, there were 4538 differents planes flying At 2022-06-27 04:56:50, there were 4542 differents planes flying At 2022-06-27 04:57:00, there were 4545 differents planes flying At 2022-06-27 04:57:10, there were 4533 differents planes flying At 2022-06-27 04:57:20, there were 4532 differents planes flying At 2022-06-27 04:57:30, there were 4545 differents planes flying At 2022-06-27 04:57:40, there were 4540 differents planes flying At 2022-06-27 04:57:50, there were 4539 differents planes flying At 2022-06-27 04:58:00, there were 4534 differents planes flying At 2022-06-27 04:58:10, there were 4530 differents planes flying At 2022-06-27 04:58:20, there were 4526 differents planes flying At 2022-06-27 04:58:30, there were 4523 differents planes flying At 2022-06-27 04:58:40, there were 4523 differents planes flying At 2022-06-27 04:58:50, there were 4511 differents planes flying At 2022-06-27 04:59:00, there were 4517 differents planes flying At 2022-06-27 04:59:10, there were 4525 differents planes flying At 2022-06-27 04:59:20, there were 4522 differents planes flying At 2022-06-27 04:59:30, there were 4523 differents planes flying At 2022-06-27 04:59:40, there were 4526 differents planes flying At 2022-06-27 04:59:50, there were 4514 differents planes flying Between 2022-06-27 04:00:00 and 2022-06-27 04:01:00, 4077 different planes flew Between 2022-06-27 04:01:00 and 2022-06-27 04:02:00, 4262 different planes flew Between 2022-06-27 04:02:00 and 2022-06-27 04:03:00, 4409 different planes flew Between 2022-06-27 04:03:00 and 2022-06-27 04:04:00, 4525 different planes flew Between 2022-06-27 04:04:00 and 2022-06-27 04:05:00, 4632 different planes flew Between 2022-06-27 04:05:00 and 2022-06-27 04:06:00, 4723 different planes flew Between 2022-06-27 04:06:00 and 2022-06-27 04:07:00, 4776 different planes flew Between 2022-06-27 04:07:00 and 2022-06-27 04:08:00, 4790 different planes flew Between 2022-06-27 04:08:00 and 2022-06-27 04:09:00, 4809 different planes flew Between 2022-06-27 04:09:00 and 2022-06-27 04:10:00, 4813 different planes flew Between 2022-06-27 04:10:00 and 2022-06-27 04:11:00, 4815 different planes flew Between 2022-06-27 04:11:00 and 2022-06-27 04:12:00, 4815 different planes flew Between 2022-06-27 04:12:00 and 2022-06-27 04:13:00, 4786 different planes flew Between 2022-06-27 04:13:00 and 2022-06-27 04:14:00, 4782 different planes flew Between 2022-06-27 04:14:00 and 2022-06-27 04:15:00, 4787 different planes flew Between 2022-06-27 04:15:00 and 2022-06-27 04:16:00, 4812 different planes flew Between 2022-06-27 04:16:00 and 2022-06-27 04:17:00, 4795 different planes flew Between 2022-06-27 04:17:00 and 2022-06-27 04:18:00, 4785 different planes flew Between 2022-06-27 04:18:00 and 2022-06-27 04:19:00, 4771 different planes flew Between 2022-06-27 04:19:00 and 2022-06-27 04:20:00, 4777 different planes flew Between 2022-06-27 04:20:00 and 2022-06-27 04:21:00, 4771 different planes flew Between 2022-06-27 04:21:00 and 2022-06-27 04:22:00, 4769 different planes flew Between 2022-06-27 04:22:00 and 2022-06-27 04:23:00, 4774 different planes flew Between 2022-06-27 04:23:00 and 2022-06-27 04:24:00, 4782 different planes flew Between 2022-06-27 04:24:00 and 2022-06-27 04:25:00, 4766 different planes flew Between 2022-06-27 04:25:00 and 2022-06-27 04:26:00, 4788 different planes flew Between 2022-06-27 04:26:00 and 2022-06-27 04:27:00, 4754 different planes flew Between 2022-06-27 04:27:00 and 2022-06-27 04:28:00, 4718 different planes flew Between 2022-06-27 04:28:00 and 2022-06-27 04:29:00, 4721 different planes flew Between 2022-06-27 04:29:00 and 2022-06-27 04:30:00, 4687 different planes flew Between 2022-06-27 04:30:00 and 2022-06-27 04:31:00, 4691 different planes flew Between 2022-06-27 04:31:00 and 2022-06-27 04:32:00, 4687 different planes flew Between 2022-06-27 04:32:00 and 2022-06-27 04:33:00, 4685 different planes flew Between 2022-06-27 04:33:00 and 2022-06-27 04:34:00, 4689 different planes flew Between 2022-06-27 04:34:00 and 2022-06-27 04:35:00, 4705 different planes flew Between 2022-06-27 04:35:00 and 2022-06-27 04:36:00, 4671 different planes flew Between 2022-06-27 04:36:00 and 2022-06-27 04:37:00, 4681 different planes flew Between 2022-06-27 04:37:00 and 2022-06-27 04:38:00, 4695 different planes flew Between 2022-06-27 04:38:00 and 2022-06-27 04:39:00, 4687 different planes flew Between 2022-06-27 04:39:00 and 2022-06-27 04:40:00, 4681 different planes flew Between 2022-06-27 04:40:00 and 2022-06-27 04:41:00, 4672 different planes flew Between 2022-06-27 04:41:00 and 2022-06-27 04:42:00, 4676 different planes flew Between 2022-06-27 04:42:00 and 2022-06-27 04:43:00, 4683 different planes flew Between 2022-06-27 04:43:00 and 2022-06-27 04:44:00, 4696 different planes flew Between 2022-06-27 04:44:00 and 2022-06-27 04:45:00, 4681 different planes flew Between 2022-06-27 04:45:00 and 2022-06-27 04:46:00, 4668 different planes flew Between 2022-06-27 04:46:00 and 2022-06-27 04:47:00, 4666 different planes flew Between 2022-06-27 04:47:00 and 2022-06-27 04:48:00, 4651 different planes flew Between 2022-06-27 04:48:00 and 2022-06-27 04:49:00, 4631 different planes flew Between 2022-06-27 04:49:00 and 2022-06-27 04:50:00, 4631 different planes flew Between 2022-06-27 04:50:00 and 2022-06-27 04:51:00, 4629 different planes flew Between 2022-06-27 04:51:00 and 2022-06-27 04:52:00, 4652 different planes flew Between 2022-06-27 04:52:00 and 2022-06-27 04:53:00, 4642 different planes flew Between 2022-06-27 04:53:00 and 2022-06-27 04:54:00, 4642 different planes flew Between 2022-06-27 04:54:00 and 2022-06-27 04:55:00, 4620 different planes flew Between 2022-06-27 04:55:00 and 2022-06-27 04:56:00, 4613 different planes flew Between 2022-06-27 04:56:00 and 2022-06-27 04:57:00, 4604 different planes flew Between 2022-06-27 04:57:00 and 2022-06-27 04:58:00, 4600 different planes flew Between 2022-06-27 04:58:00 and 2022-06-27 04:59:00, 4586 different planes flew Between 2022-06-27 04:00:00 and 2022-06-27 04:10:00, 5133 different planes flew Between 2022-06-27 04:10:00 and 2022-06-27 04:20:00, 5533 different planes flew Between 2022-06-27 04:20:00 and 2022-06-27 04:30:00, 5472 different planes flew Between 2022-06-27 04:30:00 and 2022-06-27 04:40:00, 5379 different planes flew Between 2022-06-27 04:40:00 and 2022-06-27 04:50:00, 5385 different planes flew
On choisi qu'un avion avec son 'icao24';
On fait une liste d'objets (de la classe Avion) pour chaque ligne que contient information de cet avion, au lieu d'un objet unique par avion;
On trace la position de tous les objets, comme ils étaient avions différents, mais on fait, on fait la trajectoire;
On change le carré de la carte d'après les coordinées max et min de la latitude et longitude.
set(df.icao24)
{'aaae52',
'86e82a',
'a15879',
'a1922e',
'a34729',
'7c42ce',
'a57796',
'ab04f3',
'a86e6c',
'ad8835',
'e49234',
'a53436',
'3c6709',
'a34b6b',
'a79531',
'151e10',
'a44611',
'a31477',
'a854d0',
'aa2bc4',
'ad7701',
'7c6d2b',
'a239e0',
'151ff8',
'8881c5',
'151ed0',
'a19343',
'a1463a',
'4cc279',
'a05dba',
'4bcdce',
'4a08e9',
'a0b43d',
'a95107',
'aaf8ba',
'a7c63f',
'aa9e6d',
'a2228b',
'02a0ac',
'a6cff8',
'86d61c',
'ab5fc9',
'a8062b',
'c827c2',
'a3c111',
'a9cd03',
'841043',
'a37fa1',
'440002',
'a163c2',
'a31216',
'a43e60',
'aba5b6',
'a5ef0e',
'ab5b95',
'a61565',
'a5adf1',
'80149d',
'4baa49',
'a49ad5',
'7c4e6b',
'a3229e',
'7380c5',
'a0bf90',
'4caac1',
'a82a06',
'800d58',
'407b70',
'846a5b',
'a5810c',
'a6d8e7',
'7c2b84',
'ae4a28',
'7c67d7',
'8a08b8',
'a638c5',
'a85ff5',
'c06a87',
'3c5431',
'7c7b63',
'a14c29',
'151d6f',
'7c49f9',
'a00bdd',
'4241a1',
'ac9af0',
'4891b4',
'a2bec7',
'780928',
'86d68a',
'ab6eb9',
'507c50',
'3c0f75',
'06a0b3',
'a258b7',
'394a15',
'a3bc09',
'7cf9de',
'ab20df',
'a4870d',
'7c7800',
'a3f120',
'7c44d3',
'a1cb1d',
'a84660',
'a4ce30',
'aa6ade',
'a7f40e',
'a2de17',
'a86a3d',
'850e58',
'a95fef',
'add376',
'ac0dd9',
'ad072a',
'ad4584',
'8963b1',
'c051da',
'4cad47',
'a2c1bd',
'885221',
'8a01cf',
'a745db',
'acf2cf',
'c023c8',
'a2e907',
'a042d5',
'4d0118',
'a6a627',
'acdd18',
'a441c9',
'a0a8df',
'a1c64e',
'899105',
'ad44b9',
'70204a',
'a4f3d9',
'7c52fd',
'a36f90',
'abe0df',
'a5d965',
'50028c',
'0c20b4',
'4bb86c',
'40753d',
'86eec2',
'a31a56',
'c074e5',
'71bd28',
'c054a0',
'7586a8',
'800c4e',
'8468ee',
'4cc2ae',
'a2afeb',
'a4e108',
'ab998b',
'abf78f',
'a356f6',
'841c60',
'aa1b0e',
'a2f721',
'76cdc2',
'a886bf',
'710059',
'3b9bb7',
'39b44e',
'06a12f',
'a6cffc',
'7805dd',
'a41cf8',
'a4c48f',
'780231',
'84b860',
'7c6de0',
'abafff',
'a4d5fb',
'aa2296',
'a3f04a',
'a21432',
'a8f975',
'a666cd',
'ab1c47',
'ae4a13',
'a24753',
'ab9f6d',
'acc774',
'a40b41',
'a9ff49',
'0d08a5',
'a9046d',
'8a0824',
'a6ce36',
'a22ab9',
'a2659a',
'ab7fe6',
'862d50',
'4bb1c3',
'a6e72d',
'a0956b',
'841066',
'88434f',
'ad53a6',
'a8df2c',
'7c7ab9',
'89653b',
'151ebd',
'acfa52',
'ab72b3',
'06a11d',
'800c09',
'ac7b8a',
'a43b67',
'ac8777',
'8468cc',
'ab4f5d',
'a5ec61',
'a67f2c',
'8460b0',
'801492',
'151ec0',
'8963db',
'aa6113',
'a4e181',
'899142',
'aa945d',
'7c6d36',
'ab8f0d',
'a3ed58',
'842388',
'aaeae5',
'a8fc2e',
'a4c4ec',
'a976c7',
'a06386',
'800c87',
'70605c',
'aaee3b',
'888191',
'ae1e84',
'a826f1',
'86cee7',
'899123',
'a7f40f',
'ab599b',
'a426da',
'ac0aac',
'a08f6b',
'ad21bc',
'a33843',
'a0d655',
'06a0ff',
'e494b3',
'aca309',
'a9b8aa',
'7c6d7f',
'a3a9f8',
'800d85',
'aa9ad9',
'a2af91',
'a9618a',
'a39ab4',
'7c6843',
'a90af1',
'a89597',
'ac7968',
'a996df',
'a6ec65',
'71c364',
'a557c3',
'a3bd5f',
'7c6c96',
'aa02ab',
'a0f70c',
'a6686c',
'ae0134',
'a43ea2',
'e49231',
'8681ba',
'7504af',
'a130bc',
'a80d40',
'346317',
'ae6a15',
'a7b4ea',
'a3999e',
'c8251b',
'a53b69',
'a6b253',
'a69761',
'a1c534',
'8a0825',
'a64b96',
'ab5975',
'a16113',
'a4dba2',
'a56661',
'a7d725',
'a284b5',
'89408e',
'4cc50e',
'7c6b1c',
'c0807f',
'a00a0c',
'ac0818',
'89648a',
'151daf',
'a9b535',
'781cdf',
'a59021',
'71c038',
'a066a3',
'a56dcf',
'ac8d5c',
'86e430',
'7c6b09',
'86d629',
'abefba',
'86375c',
'a3c8cb',
'48ae03',
'84c7d2',
'a19b72',
'a18d29',
'acc799',
'87339a',
'71bf28',
'8526e3',
'a8a083',
'a54c33',
'e495b1',
'a22b2f',
'76cda2',
'a8bf73',
'8a0818',
'70612e',
'4007f5',
'a19404',
'a44e59',
'a3965c',
'06a061',
'abb271',
'800d13',
'a04f40',
'a842a9',
'e486c1',
'a324b0',
'7c4400',
'a26ea6',
'c050a0',
'a92be6',
'aa0701',
'ab9c61',
'a1515b',
'4baa46',
'75854a',
'a37389',
'ac15d1',
'c079d5',
'a83043',
'aa7e7b',
'a4491f',
'800d94',
'44aac1',
'888149',
'a71efa',
'7c6bc0',
'abbd8d',
'89631c',
'151fef',
'a2107b',
'a90ede',
'846d0c',
'a027ca',
'a0d72b',
'a393e6',
'a54c70',
'885223',
'4baa10',
'a144af',
'48ae23',
'4d0107',
'151e2d',
'40771a',
'aaed5a',
'aaee9c',
'151dea',
'800cec',
'a135cb',
'a5c059',
'800d14',
'885308',
'7c42e1',
'a7b0c4',
'0d0cb1',
'a3d014',
'a4e8d2',
'aa4d77',
'7100b2',
'ac02b4',
'801432',
'ad0ba2',
'acbe9c',
'adca15',
'ab8fee',
'151d8f',
'510115',
'888185',
'80139d',
'a3a235',
'3d0fb2',
'a19785',
'4844a0',
'4d2314',
'a9d5e5',
'a8b8b9',
'a706ea',
'3a46b1',
'89610b',
'e4898a',
'781ac4',
'ac74b3',
'8014c8',
'a81e15',
'800af4',
'a2b12e',
'71c302',
'c0797b',
'7c7f32',
'aa7e2e',
'ab9bb6',
'4bab45',
'aae810',
'8013cb',
'ab40f8',
'e48ba9',
'7c11ba',
'0d0e20',
'406f72',
'abbf72',
'0d0e0e',
'89913a',
'7c68b6',
'846682',
'49d365',
'a3c031',
'a157d9',
'8411a4',
'71c256',
'aab100',
'acdde3',
'845dcc',
'aab1af',
'505ce6',
'86ef8e',
'ab00ce',
'0d056c',
'738053',
'710dc0',
'ace08c',
'4b43b0',
'84b451',
'aba10d',
'896504',
'a261c9',
'aaaddc',
'8007b0',
'a320a6',
'862db6',
'4bab4f',
'3a46b5',
'ab942f',
'70afb9',
'750466',
'a22ac6',
'c00ba7',
'a887e0',
'a39723',
'a2e57e',
'a9bb70',
'a3c900',
'846dc8',
'06a0a6',
'a365c9',
'801421',
'4bb18d',
'a06270',
'a376ec',
'c05da4',
'710111',
'a2c467',
'e8060e',
'8014db',
'896526',
'a442f3',
'abc478',
'a785fd',
'7c7b64',
'4bc847',
'aa2a8a',
'e494f1',
'34268d',
'4bb284',
'a0f2a9',
'abb0a2',
'885177',
'a8c802',
'a2f41d',
'a34978',
'e0b048',
'80145d',
'a69974',
'a3fb6f',
'40066b',
'06a094',
'a3472f',
'888096',
'8013e2',
'0d0a27',
'84b495',
'a414e8',
'a4766a',
'407cd1',
'504e57',
'342450',
'48412b',
'a68c54',
'758087',
'a27600',
'a8e45c',
'4c0178',
'ac22a7',
'a223c1',
'a21c29',
'a42665',
'e4988b',
'7c1b37',
'8963b5',
'a339b4',
'a36b39',
'4850f5',
'a4afbe',
'a78c3e',
'780217',
'a09fc4',
'c80e79',
'750490',
'abe79d',
'a3e18f',
'7583ee',
'a6ef36',
'a21fa1',
'ac712d',
'4851af',
'4acac5',
'a96f07',
'800d33',
'7804f2',
'ae290a',
'738101',
'86d668',
'aa490a',
'85111f',
'4bb86e',
'a793b1',
'ab249e',
'8014b2',
'8a0849',
'3c66c1',
'7c7795',
'8681b9',
'0d0d86',
'a28a5a',
'c07fb0',
'a07514',
'abd010',
'aa7082',
'a1c2f1',
'a3ed69',
'e48e77',
'a8f58c',
'ab358d',
'a6b1a3',
'c87f29',
'46788f',
'a448f5',
'c05efd',
'c0219c',
'aa9f1c',
'800cce',
'a445cd',
'a1f116',
'c01040',
'a92361',
'a4efdb',
'3c65d2',
'abe4db',
'c05edf',
'aa244a',
'c05512',
'151e8f',
'a4ae15',
'8a08b1',
'7c6ca0',
'7100c8',
'600b24',
'71c324',
'c055cd',
'a35d9e',
'406ade',
'aa8c10',
'a8d2a8',
'ac0b96',
'a360e3',
'39cf07',
'a08512',
'7c7a4a',
'89405e',
'401079',
'a8ef81',
'acd0c2',
'a5fcef',
'a13e1c',
'a59f53',
'7c1b2b',
'151e19',
'c07b42',
'06a0a7',
'a02a44',
'a88467',
'888147',
'a894c0',
'8004d6',
'a10bbc',
'abadd6',
'ad3870',
'a448d5',
'a2682a',
'7c6dd7',
'acb4c1',
'8964e2',
'800d43',
'0a001a',
'a27a26',
'a2b12d',
'7c7bce',
'a24a0a',
'4952b0',
'ab5d52',
'a63e46',
'acc23f',
'ac8111',
'a37db9',
'a9cdd2',
'7c79d6',
'ac2952',
'a4ce71',
'a85d50',
'a33d68',
'0d0760',
'896411',
'a178ae',
'aad5ca',
'86d295',
'780be3',
'a851e2',
'7c6a8c',
'896191',
'a8dfc7',
'a48fbe',
'ac2dea',
'76b865',
'0c20a8',
'a4c0a8',
'400773',
'a4cbfd',
'a41447',
'c031c9',
'a1388c',
'7c6282',
'ad7b02',
'3c6703',
'840659',
'a46ce1',
'aa7a61',
'aa955c',
'a3ad89',
'c030f7',
'7c7c76',
'ab39f0',
'a3ec89',
'a223f0',
'46b828',
'86796c',
'4d0116',
'a9dea0',
'a0958d',
'ac5d61',
'a641bf',
'a2fe28',
'7c77fa',
'151fb7',
'ad0c51',
'aac540',
'aa9723',
'a3a5ec',
'4bd183',
'7586d7',
'06a0df',
'a0345f',
'151dc9',
'acea6a',
'71bf90',
'a0f869',
'a448f6',
'800407',
'abd1e3',
'c01a61',
'ab477d',
'aaa9b6',
'a02f50',
'a3b110',
'7c02e1',
'a87b97',
'a6893c',
'88819a',
'a42b45',
'c0502e',
'a22642',
'a34201',
'a74871',
'70c0c6',
'a4350c',
'a20d01',
'0d0b7c',
'a44a6d',
'4bcde8',
'76cd04',
'8014df',
'4ca9c3',
'c80cdf',
'a857c2',
'800cb6',
'4b8e0c',
'adb437',
'c810af',
'152027',
'a7df59',
'adb7ee',
'c0523f',
'7502de',
'a9c98f',
'0c6060',
'800da2',
'c05060',
'500194',
'a2d6a2',
'800c9b',
'89630d',
'7c39f9',
'c81c58',
'440c8d',
'ac3fec',
'ad2df0',
'c035f7',
'a880b0',
'c82986',
'0c20dc',
'ad0083',
'0d07fa',
'a2c93f',
'c821ee',
'4baad3',
'758691',
'a5823e',
'a93711',
'ab483c',
'abfd39',
'abd5bb',
'4ca9df',
'75049d',
'151df8',
'a9c52e',
'a35283',
'86d94a',
'a0ddfb',
'4bcdd5',
'86d310',
'ab5b66',
'a1c5e0',
'76b44b',
'a68ddb',
'aa7409',
'861c10',
'7c6729',
'a511f6',
'a252a7',
'a1d93b',
'a1417f',
'a687ac',
'a4972c',
'3c6701',
'c8195c',
'ab38aa',
'a9be80',
'86260b',
'ab184d',
'a64d03',
'a2b10f',
'a5d643',
'aaf83c',
'a32867',
'a97328',
'86e28f',
'75044a',
'a4fbb4',
'0d0d36',
'acddbe',
'3444ce',
'7812a1',
'abe77a',
'0ac9ef',
'aa030b',
'800c92',
'a3524f',
'48ae25',
'71c041',
'adea26',
'abe2a3',
'71c056',
'0d0bbe',
'aaad49',
'ac18fe',
'ad493b',
'ab03a4',
'a8d46a',
'75044b',
'406c80',
'a536d5',
'78110b',
'a411df',
'a55017',
'06002f',
'a271fd',
'738443',
'a3183d',
'7c4510',
'a7e9e4',
'800ced',
'70c0fd',
'a31a54',
'ad4870',
'89405c',
'a657ad',
'801407',
'acc5fb',
'a6f482',
'448465',
'c060b3',
'3c64f5',
'a89872',
'ae4a79',
'a2a686',
'86eee4',
'a0835d',
'a174f7',
'adde95',
'ae1478',
'aa7952',
'06a19f',
'4841c5',
'872fa0',
'4ba9c8',
'abd932',
'ac3dc8',
'76cc6f',
'c012bd',
'800db0',
'a682ef',
'a7912a',
'7803b0',
'4d22ec',
'48455e',
'7100c1',
'a1dc31',
'896307',
'a33325',
'e07246',
'68322c',
'a02792',
'a8d360',
'896175',
'c0816e',
'ad8895',
'a28812',
'a47d11',
'88809d',
'440144',
'ab9387',
'155bca',
'750141',
'a3a0cc',
'861f1a',
'76cd0c',
'a4c757',
'a254f8',
'8410b9',
'4077c6',
'885968',
'aa777e',
'846bfa',
'a1e5f8',
'a0d9dd',
'a5ac1d',
'a4b7d3',
'abec6c',
'4baa50',
'a88cbf',
'a5d1f7',
'4bb161',
'a9c537',
'a28bc9',
'ab4ba6',
'896453',
'7c42d6',
'155c0d',
'abff87',
'a87f50',
'7c3868',
'a03b67',
'7c7a46',
'aa1f65',
'140b40',
'7380c0',
'a92fa3',
'7c8066',
'71c319',
'a83988',
'4bcde4',
'a4b41c',
'8681aa',
'84640c',
'8674ac',
'a7e509',
'a05f92',
'add66d',
'781b7b',
'80141c',
'ada4fb',
'a145b7',
'c81c28',
'71c334',
'3e4053',
'aa369a',
'e80242',
'4bb324',
'a4f752',
'151eca',
'a8f3c5',
'7c4929',
'a2f584',
'a2e93c',
'c0360e',
'abd9b6',
'a070d7',
'ac048d',
'a93209',
'7c2bea',
'a56323',
'a11afd',
'7380cb',
'ad27f3',
'a443e8',
'c06b76',
'ad8301',
'a2b8db',
'a2175c',
'a9e4bc',
'71c008',
'45ce55',
'a4f5a0',
'a08663',
'a1d811',
'4841a6',
'4952a8',
'344503',
'c82458',
'aaa4be',
'71bd53',
'7800e8',
'89408c',
'a34bdc',
'aa9b89',
'aae911',
'850e9c',
'71bf44',
'c01d1f',
'ae6499',
'c06cc3',
'adb29f',
...}
df_avion = df[df.icao24 == '86375c']
lats = df_avion['lat'].to_list()
longs = df_avion['lon'].to_list()
max(lats), min(lats), max(longs), min(longs)
(40.93336486816406, 35.259796142578125, 140.679931640625, 136.89221970578458)
nv_ciel = []
for k in range(len(df_avion)):
nv_ciel.append(Avion.fromList(df_avion.iloc[k].to_list()[1:]))
# Création d'une nouvelle figure de 15 pouces de large et de haut.
# Le dpi (dots-per-inch) c'est la résolution de la figure
fig = plt.figure(figsize=(15,15),dpi=200)
# Implémentation de la recherche de tuiles web en utilisant le système de coordonnées Google WTS.
tile = cimgt.GoogleTiles("RGB")
# Create a GeoAxes in the tile's projection.
ax = fig.add_subplot(1, 1, 1, projection=tile.crs)
# Limitation de l'étendue de la carte à une petite plage de longitude/latitude.
ax.set_extent([min(longs)-2, max(longs)+2, min(lats)-2, max(lats)+2], crs=ccrs.Geodetic())
# Addition de la tuile aux axes au niveau de zoom 8
ax.add_image(tile, 8)
# Création d'un chemin à partir du texte avec TextPath.
# Le symbole unicode U+2708 est utilisé.
SUCCESS_SYMBOLS = TextPath((0, 0), "✈")
# Tous les avions sont ajoutés/dessinés sur la carte.
for af in nv_ciel:
# Création d'un MarkerStyle pour pouvoir le faire tourner arbitrairement.
m = MarkerStyle(SUCCESS_SYMBOLS)
#af.longitude = longs
#af.latitude = lats
# Rotation du marker
# Ajoutez 90 degrés pour que le symbole X soit orienté vers le nord lorsqu'il est à 0 degré.
# L'attribut "true_track" est soustrait afin que l'angle soit positif du côté droit,
# comme expliqué sur ce site web : https://www.skybrary.aero/articles/heading-track-and-radial
m._transform = m.get_transform().rotate_deg(90 - af.true_track)
# Définition de la couleur du marker
if af.velocity > 10:
color='r'
else:
color="r"
# L'avion est ajouté à la carte en fonction de ses valeurs de latitude et de longitude.
# La taille de la figure dépend directement de la vitesse actuelle de l'avion.
ax.plot(af.longitude, af.latitude,
marker=m,
color=color, markersize=10*af.velocity/300, transform=ccrs.Geodetic())
# La figure est affichée
plt.show()